package com.jy.appmarket.cards;

import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;

import android.content.Context;

import com.jy.appmarket.utils.LogUtil;

/**
 * 类说明：
 * 
 * @author Baker.li
 * @date 2015年8月21日
 * @version 1.0
 */

public final class CardsUtils {
	private static final String TAG = "CardsUtils";
	private static final String PKG = CardsUtils.class.getPackage().getName();
	private static Map<String, Constructor<?>> sMap = new HashMap<String, Constructor<?>>();

	public static BaseUICard getCardInstance(Context context, com.jy.app.market.idata.card.Card card) {
		if (card == null) {
			return null;
		}
		String type = card.getType();
		if (type == null || !type.startsWith("Card")) {
			return null;
		}
		try {
			Constructor<?> con = sMap.get(type);
			if (con != null) {
				return (BaseUICard) con.newInstance(context, card);
			}
			String clzName = PKG + "." + type.substring(4) + "UICard";
			Class<?> clz = Class.forName(clzName);
			con = clz.getConstructor(Context.class, card.getClass());
			sMap.put(type, con);
			LogUtil.d(TAG, clzName);
			return (BaseUICard) con.newInstance(context, card);
		} catch (Exception e) {
			if (type != null && sMap.containsKey(type)) {
				sMap.remove(type);
			}
			e.printStackTrace();
		}
		return null;
	}
	// public static boolean check(Context context) {
	// if (context == null) {
	// return false;
	// }
	// String prefix = context.getPackageName() + ".cards";
	// Set<Integer> types = new HashSet<Integer>();
	// try {
	// DexFile df = new DexFile(context.getPackageCodePath());
	// for (Enumeration<String> iter = df.entries(); iter.hasMoreElements();) {
	// String s = iter.nextElement();
	// if (!s.startsWith(prefix)) {
	// continue;
	// }
	// if (s.endsWith("UICard")) {
	// Class<?> cls = Class.forName(s);
	// Method getType = cls.getDeclaredMethod("getType");
	// Constructor<?> c = cls.getConstructor(Context.class);
	// Object obj = c.newInstance(context);
	// int type = (Integer) getType.invoke(obj);
	// if (!types.add(type)) {
	// LogUtil.w("CardsChecker", "type conflict:" + s);
	// }
	// LogUtil.d("CardsChecker", "cls:" + s + " " + type);
	// }
	// }
	// return true;
	// } catch (IOException e) {
	// e.printStackTrace();
	// } catch (ClassNotFoundException e) {
	// e.printStackTrace();
	// } catch (InstantiationException e) {
	// e.printStackTrace();
	// } catch (IllegalAccessException e) {
	// e.printStackTrace();
	// } catch (NoSuchMethodException e) {
	// e.printStackTrace();
	// } catch (IllegalArgumentException e) {
	// e.printStackTrace();
	// } catch (InvocationTargetException e) {
	// e.printStackTrace();
	// }
	// return false;
	// }
}